/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
 
 package sump;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 *
 * @author Diegolas
 */
public class Juego {
    
    Mapa mapaPrueb = new MapaPrueba();
    
    private final int FRAMES_PER_SECOND = VariableList.framesPerSecond;
    private final long SKIP_TICKS = 1000/FRAMES_PER_SECOND;

    private Elemento[] elementos = new Elemento[100];
    
    private Rectangle2D cuadrado = new Rectangle2D.Double(0, 0, 50, 50);
    
    private boolean run = true;
    private Canvas canvas = new Canvas();
    private JFrame frame;
    private int ancho = VariableList.ancho;
    private int alto = VariableList.alto;
    
    private EntradaTeclado teclado= new EntradaTeclado();
    private EntradaMouse mouse = new EntradaMouse();
    private BufferStrategy buffer;
    private Graphics2D g2D;
    
    //valores de teclas por defecto para el arreglo teclas
    public static final int ARRIBA = 0;
    public static final int ABAJO = 1;
    public static final int IZQUIERDA = 2;
    public static final int DERECHA = 3;
    public static final int B_ESPA = 4;
    public static final int B = 5;
    public static final int C = 6;
    public static final int D = 7;
    
    public static final int MOUSE_B1 = 8;
    public static final int MOUSE_B2 = 9;
    public static final int MOUSE_B3 = 10;
    
    
    //pundo donde se encuentra el mouse
    private Point puntoMouse = new Point(0, 0);
    //creamos el arreglo con las teclas desactivadas y un arreglo que nos dice
    //cual es el valor de cada tecla(por defecto)
    private boolean teclas[] = new boolean[15];
    {
        teclas[ARRIBA]=false;
        teclas[ABAJO]=false;
        teclas[IZQUIERDA]=false;
        teclas[DERECHA]=false;
        teclas[B_ESPA]=false;
        teclas[B]=false;
        teclas[C]=false;
        teclas[D]=false;
        teclas[MOUSE_B1]=false;
        teclas[MOUSE_B2]=false;
        teclas[MOUSE_B3]=false;
        
    };
    private int valorTecla[] = new int[15];
    {     
        valorTecla[ARRIBA]=KeyEvent.VK_W;
        valorTecla[ABAJO]=KeyEvent.VK_S;
        valorTecla[IZQUIERDA]=KeyEvent.VK_A;
        valorTecla[DERECHA]=KeyEvent.VK_D;
        valorTecla[B_ESPA]=KeyEvent.VK_SPACE;
        valorTecla[B]=KeyEvent.VK_Q;
        valorTecla[C]=KeyEvent.VK_E;
        valorTecla[D]=KeyEvent.VK_R;
        valorTecla[MOUSE_B1]=MouseEvent.BUTTON1;
        valorTecla[MOUSE_B2]=MouseEvent.BUTTON2;
        valorTecla[MOUSE_B3]=MouseEvent.BUTTON3;
    };
    
    public Juego(String nombreJuego) {
        
        frame = new JFrame(nombreJuego);
        JPanel panel = (JPanel) frame.getContentPane();
        panel.setPreferredSize(new Dimension(ancho, alto));
        
        canvas.setSize(ancho,alto);
        panel.add(canvas);
        canvas.setIgnoreRepaint(true);
        
        //frame.setSize(ancho, alto);
        frame.setResizable(false);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        frame.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e)
        {
            exit();
        }
        });
        
        canvas.addKeyListener(teclado);
        canvas.addMouseListener(mouse);
        canvas.addMouseMotionListener(mouse);
        canvas.requestFocus();
        canvas.createBufferStrategy(2);
        buffer = canvas.getBufferStrategy();
        
    }
        
    public void exit()
    {
        System.exit(0);
    }
    
    public void bucle()
    {
        double nextGameTick = System.currentTimeMillis();
        double sleepTime = 0;
        double ultimoBucle = System.currentTimeMillis();
        while(run)
        {
            double dt = System.currentTimeMillis()-ultimoBucle;
            
            actualizarJuego(dt);
            pintarJuego();
            
            nextGameTick += SKIP_TICKS;
            sleepTime = nextGameTick - System.currentTimeMillis();
            ultimoBucle = System.currentTimeMillis();
            if (sleepTime >=0)
            {
                try
                {
                    Thread.sleep((long)sleepTime);
                }
                catch(InterruptedException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }
    
    
    public void actualizarJuego(double dt)
    {
        mapaPrueb.actualizar(dt, teclas);
    }

    public void pintarJuego()
    {
        
        g2D = (Graphics2D) buffer.getDrawGraphics();
        
        g2D.setColor(Color.darkGray);
        g2D.fillRect(0, 0, ancho, alto);
        
        mapaPrueb.pintar(g2D);
        
        g2D.dispose();
        buffer.show();
    }
    
    
    private class EntradaTeclado extends KeyAdapter
    {
        public void keyPressed(KeyEvent e)
        {
            if (e.getKeyCode() == valorTecla[ARRIBA])
                teclas[ARRIBA] = true;
            if (e.getKeyCode() == valorTecla[ABAJO])
                teclas[ABAJO] = true;
            if (e.getKeyCode() == valorTecla[IZQUIERDA])
                teclas[IZQUIERDA] = true;
            if (e.getKeyCode() == valorTecla[DERECHA])
                teclas[DERECHA] = true;
            if (e.getKeyCode() == valorTecla[B_ESPA])
                teclas[B_ESPA] = true;
            if (e.getKeyCode() == valorTecla[B])
                teclas[B] = true;
            if (e.getKeyCode() == valorTecla[C])
                teclas[C] = true;
            if (e.getKeyCode() == valorTecla[D])
                teclas[D] = true;    
        }
        public void keyReleased(KeyEvent e)
        {
            if (e.getKeyCode() == valorTecla[ARRIBA])
                teclas[ARRIBA] = false;
            if (e.getKeyCode() == valorTecla[ABAJO])
                teclas[ABAJO] = false;
            if (e.getKeyCode() == valorTecla[IZQUIERDA])
                teclas[IZQUIERDA] = false;
            if (e.getKeyCode() == valorTecla[DERECHA])
                teclas[DERECHA] = false;
            if (e.getKeyCode() == valorTecla[B_ESPA])
                teclas[B_ESPA] = false;
            if (e.getKeyCode() == valorTecla[B])
                teclas[B] = false;
            if (e.getKeyCode() == valorTecla[C])
                teclas[C] = false;
            if (e.getKeyCode() == valorTecla[D])
                teclas[D] = false;
        }

        
    }
    

    private class EntradaMouse extends MouseAdapter
    {


        public void mouseEntered(MouseEvent e) {
//        BufferedImage cursorImg = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB);
//        Cursor blankCursor = Toolkit.getDefaultToolkit().createCustomCursor(
//        cursorImg, new Point(0, 0), "blanks cursor");
//        canvas.setCursor(blankCursor);
        }
        
        
        public void mousePressed(MouseEvent e) {
            
            if (valorTecla[MOUSE_B1]==e.getButton())
                teclas[MOUSE_B1] = true;
            if (valorTecla[MOUSE_B2]==e.getButton())
                teclas[MOUSE_B2] = true;
            if (valorTecla[MOUSE_B3]==e.getButton())
                teclas[MOUSE_B3] = true;
            
        }

        public void mouseReleased(MouseEvent e) {
            if (valorTecla[MOUSE_B1]==e.getButton())
                teclas[MOUSE_B1] = false;
            if (valorTecla[MOUSE_B2]==e.getButton())
                teclas[MOUSE_B2] = false;
            if (valorTecla[MOUSE_B3]==e.getButton())
                teclas[MOUSE_B3] = false;
        }


        public void mouseMoved(MouseEvent e) {
            puntoMouse.setLocation(e.getPoint());
        }

        public void mouseDragged(MouseEvent e) {
            puntoMouse.setLocation(e.getPoint()); 
        }
        
    }
}
